'use strict';

/**
 * 系统配置服务
 */
const Service = require('egg').Service;

class SystemConfigService extends Service {
  /**
   * 创建系统配置
   * @param {Object} configData - 配置数据
   * @return {Promise<Object>} 创建的配置
   */
  async create(configData) {
    const { ctx } = this;
    return ctx.model.SystemConfig.create(configData);
  }

  /**
   * 查询系统配置列表
   * @param {Object} query - 查询条件
   * @param {Number} page - 页码
   * @param {Number} pageSize - 每页数量
   * @return {Promise<Object>} 配置列表和总数
   */
  async list(query = {}, page = 1, pageSize = 10) {
    const { ctx } = this;
    const offset = (page - 1) * pageSize;
    const where = {};

    if (query.key) {
      where.key = { [ctx.Sequelize.Op.like]: `%${query.key}%` };
    }

    if (query.name) {
      where.name = { [ctx.Sequelize.Op.like]: `%${query.name}%` };
    }

    if (query.status !== undefined && query.status !== '') {
      where.status = query.status;
    }

    const { count, rows } = await ctx.model.SystemConfig.findAndCountAll({
      where,
      offset,
      limit: pageSize,
      order: [[ 'create_time', 'DESC' ]],
    });

    return {
      list: rows,
      total: count,
      page,
      pageSize,
    };
  }

  /**
   * 根据键查询配置
   * @param {String} key - 配置键
   * @return {Promise<Object>} 配置信息
   */
  async findByKey(key) {
    const { ctx } = this;
    return ctx.model.SystemConfig.findOne({
      where: { key, status: true },
    });
  }

  /**
   * 查询单个配置
   * @param {String} id - 配置ID
   * @return {Promise<Object>} 配置信息
   */
  async findById(id) {
    const { ctx } = this;
    return ctx.model.SystemConfig.findByPk(id);
  }

  /**
   * 更新系统配置
   * @param {String} id - 配置ID
   * @param {Object} configData - 更新的配置数据
   * @return {Promise<Object>} 更新后的配置
   */
  async update(id, configData) {
    const { ctx } = this;
    const config = await this.findById(id);
    if (!config) {
      ctx.throw(404, '配置不存在');
    }

    return config.update(configData);
  }

  /**
   * 删除系统配置
   * @param {String} id - 配置ID
   * @return {Promise<Boolean>} 是否删除成功
   */
  async destroy(id) {
    const { ctx } = this;
    const config = await this.findById(id);
    if (!config) {
      ctx.throw(404, '配置不存在');
    }

    return config.destroy();
  }

  /**
   * 更新配置状态
   * @param {String} id - 配置ID
   * @param {Boolean} status - 状态
   * @return {Promise<Object>} 更新后的配置
   */
  async updateStatus(id, status) {
    const { ctx } = this;
    const config = await this.findById(id);
    if (!config) {
      ctx.throw(404, '配置不存在');
    }

    config.status = status;
    return config.save();
  }

  /**
   * 批量获取配置
   * @param {Array} keys - 配置键数组
   * @return {Promise<Object>} 配置键值对
   */
  async getConfigsByKeys(keys) {
    const { ctx } = this;
    const configs = await ctx.model.SystemConfig.findAll({
      where: { key: keys, status: true },
    });

    const result = {};
    configs.forEach(config => {
      // 根据类型转换值
      let value = config.value;
      if (config.type === 'number') {
        value = Number(value);
      } else if (config.type === 'boolean') {
        value = value === 'true' || value === true;
      } else if (config.type === 'json') {
        try {
          value = JSON.parse(value);
        } catch (e) {
          // 保持原值
        }
      }
      result[config.key] = value;
    });

    return result;
  }
}

module.exports = SystemConfigService;
